package main

import (
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

// 1.定义模型
type User struct {
	gorm.Model //ID CreateAt UpdateAt DeleteAt
	Name       string
	Age        int64
	Active     bool
}

func main() {
	//连接MYSQL数据库
	dsn := "root:flm@(127.0.0.1:3306)/db1?charset=utf8mb4&parseTime=True&loc=Local"
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		panic(err)
	}

	// 2.把模型与数据库中的表对应起来
	db.AutoMigrate(&User{})

	// 3.创建
	// u1 := User{Name: "flm1", Age: 18, Active: true}
	// db.Debug().Create(&u1)
	// u2 := User{Name: "flm2", Age: 20, Active: false}
	// db.Create(&u2)

	// 4.查询
	var user User
	db.First(&user)

	// 5.更新
	user.Name = "Furemii"
	user.Age = 99
	//db.Debug().Save(&user) //默认会修改所有字段
	//db.Debug().Model(&user).Update("name", "芙remii") //使用 Update 更新指定单列

	//Updates更新多个字段
	// m1 := map[string]interface{}{
	// 	"name":   "fufufu",
	// 	"age":    29,
	// 	"active": true,
	// }
	// db.Debug().Model(&user).Updates(m1)                //m1列出来的所有字段都会更新
	// db.Debug().Model(&user).Select("age").Updates(m1)  //只更新age字段
	// db.Debug().Model(&user).Omit("active").Updates(m1) //排除active字段更新

	// db.Model(&user).UpdateColumn("name", "hello")               //只更新选定的单列,不更新hooks(UpdateAt)
	// db.Model(&user).UpdateColumns(User{Name: "hello", Age: 18}) //只更新选定的多列,不更新hooks(UpdateAt)

	// rowsNum := db.Model(User{}).Where("active = ?", true).Updates(User{Name: "hi!!", Age: 27}).RowsAffected //更新的记录数
	// fmt.Println(rowsNum)

	//让users表中所有的用户的年龄在原来的基础上+2
	db.Model(User{}).Where("active = ?", true).Update("age", gorm.Expr("age+?", 2)) //当使用 Update 更新单列时，需要有一些条件(Where)

}
